package com.cskaoyan.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

/**
 * @author stone
 * @date 2022/07/07 16:07
 */
@Component
public class CustomAspect {

    // 切面组件中的方法名是任意的
    public void before() {
        System.out.println("before通知执行的方法");
    }

    public void after() {
        System.out.println("after通知执行的方法");
    }

    // Around通知 → 是围绕委托类方法的执行的
    // 类似于InvocationHandler的invoke和MethodInterceptor的invoke
    // 里面也包含了委托类方法的调用 👉 通过ProceedingJoinPoint提供的方法可以执行委托类的方法
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Around的前半部分");
        //执行委托类方法，类似于method.invoke(instance,args)
        // methodInvocation.proceed()
        Object proceed = joinPoint.proceed();
        System.out.println("Around的后半部分");
        return proceed;
    }

    // AfterReturning通知可以获得委托类方法return的值
    public void afterReturning(Object result) {
        System.out.println("AfterReturning通知:" + result);
    }

    public void afterThrowing(Exception exception) {
        System.out.println("抛出的异常：" + exception.getMessage());
    }
}
